package JDBC;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/8/25 20:29
 * JDBC 插入 - 代码示例
 *      实现用户交互插入数据
 *          法一：使用字符串进拼接操作，不推荐，但是可行。1.写起来麻烦，容易写错
 *                                                    2.这么写容易引起sql注入攻击。
 *                                                    这么直接拼接，属于上个时代
 *          法二：推荐使用：? 表示此处地方不确定，再进行替换操作
 *         下边的操作，从1开始，把第一个问号换为 num, 第二个？换为name
 *         进行statement.setXXX替换
 */
public class JDBCInsert {
    public static void main(String[] args) throws SQLException {
        //创建输入交互对象
        Scanner scanner = new Scanner(System.in);
        //1.获取数据库资源,设置信息
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jdbc?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("1234");
        //2.建立连接
        Connection connection = dataSource.getConnection();
        //2.5 用户输入数据
        System.out.println("请输入学号：");
        int id =scanner.nextInt();
        System.out.println("请输入名字：");
        String name = scanner.next();

        //3.操作数据库，建立sql语句，准备statement对象
        //不推荐，不科学，但可行。
//        String sql = "insert into Student values(" + id + ",'" + name + "')";
//        PreparedStatement statement = connection.prepareStatement(sql);

        //推荐使用：? 表示此处地方不确定，再进行替换操作
        //下边的操作，从1开始，把第一个问号换为 num, 第二个？换为name
        String sql = "insert into Student values(?,?)";
        PreparedStatement statement = connection.prepareStatement(sql);
        //进行statement.setXXX替换
        statement.setInt(1,id);
        statement.setString(2,name);
        System.out.println("statement : "+statement);
        //4.执行sql
        int ret = statement.executeUpdate();
        System.out.println("影响了"+ret+"行！");
        //5.回收资源        先关内部，再关外部
        statement.close();
        connection.close();
    }
}
